package com.zhongwang.business.module.system.role;

import com.zhongwang.business.gen.entity.Role;
import com.zhongwang.business.gen.mapper.RoleMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

import static com.zhongwang.business.constant.Constant.STATUS_NORMAL;


/**
 *  角色 服务层
 *
 * @author China.sgl
 * @date 2019/9/16 09:11
 */
@Service
public class RoleService {

    @Autowired
    private RoleMapper roleMapper;
    @Autowired
    private RoleDao roleDao;

    /**
     * 查询帐户角色
     * @param id 帐户 id
     * @return 角色集合
     */
    public List<Role> findRolesByUserId(Integer id) {
        return roleDao.findRolesByUserId(id);
    }

    /**
     * 查询所有角色
     *
     * @return 角色集合
     */
    public List<Role> findAll(Role role) {
        return roleDao.findAll(role);
    }

    /**
     * 修改角色
     * @param role 角色信息
     * @return 修改行数
     */
    public int delRole(Role role) {
        int row = roleMapper.updateByPrimaryKeySelective(role);
        roleDao.updateByPid(role.getId());
        return  row;
    }

    /**
     * 按角色名查询角色
     * @param name 角色名
     * @return 角色信息
     */
    public Role findRoleByName(String name) {
        return roleDao.findByName(name);
    }

    /**
     * 保存角色信息
     * @param role 角色信息
     * @param permissionIds 权限 id 数组
     * @return 影响行数
     */
    @Transactional(rollbackFor = Exception.class)
    public int saveRole(Role role, Integer[] permissionIds) {
        role.setStatus(STATUS_NORMAL);
        int row = roleMapper.insert(role);
        if (permissionIds != null && permissionIds.length > 0) {
            roleDao.batchInsertRolePermissions(role.getId(), permissionIds);
        }
        return row;
    }

    /**
     * 修改角色及拥有权限
     * @param role 角色信息
     * @param permissionIds 拥有权限ID
     * @return 影响行数
     */
    @Transactional(rollbackFor = Exception.class)
    public int updateRole(Role role, Integer[] permissionIds) {
        int row = roleMapper.updateByPrimaryKeySelective(role);
        roleDao.deleteRoleMenuByRoleId(role.getId());
        if (permissionIds != null && permissionIds.length > 0) {
            roleDao.batchInsertRolePermissions(role.getId(), permissionIds);
        }
        return row;
    }

    /**
     * 查询所有角色，标识帐户拥有角色
     * @param id 用户id
     * @return 角色集合
     */
    public List<Role> findRolesCheckedByUserId(Integer id) {
        List<Role> roleModels = roleDao.findAll(new Role());
        List<Role> roles = roleDao.findRolesByUserId(id);
        for (Role roleModel : roleModels) {
            for (Role role : roles) {
                if (roleModel.getId().equals(role.getId())) {
                    roleModel.setCheckFlag(true);
                    break;
                }
            }
        }
        return roleModels;
    }

    /**
     * s根据主键查询角色
     *
     * @param id 主键
     * @return 角色
     */
    public Role findRoleById(Integer id) {
        return roleMapper.selectByPrimaryKey(id);
    }


}
